import java.util.Scanner;

/**
 * @User: vitobo
 * @Date: 2024-04-01
 * @Description: 方法学习
 */




public class Method {

    // 递归: 方法在执行过程中调用自身
    // 每次递归, 这个方法只执行了一部分就去执行另一部分; 归的时候, 会把当前方法的剩余部分执行完毕; 递和归的次数是一样的
    // 递归, 递的时候, 在栈上存放, 归的时候才依次释放
    // 递归条件: 起始条件, 递推公式

    // 汉诺塔(河内塔)
    /*
        pos1 起始位置
        pos2 中转位置
        pos3 目标位置
     */
    public static void hanio(int n, char pos1, char pos2, char pos3) {
        if(n == 1){
            move(pos1, pos3);
            return;
        }

        hanio(n-1, pos1, pos3, pos2);
        move(pos1, pos3);
        hanio(n-1, pos2, pos1, pos3);
    }
    /*
        pos1 起始位置
        pos2 目标位置
     */
    public static  void move(char pos1, char pos2) {
        System.out.print(pos1 + " -> " + pos2 + "  ");
    }

    public static void main(String[] args) {
        hanio(1, 'A', 'B', 'C');
        System.out.println();
        hanio(2, 'A', 'B', 'C');
        System.out.println();
        hanio(3, 'A', 'B', 'C');
        System.out.println();
    }


    // 求斐波那契数列(递归) , 尽量写非递归的
    public static int fib(int n){
        // fac(n) = fac(n-1) + fac(n-2)
        if(n==1 || n==2){
            return 1;
        }
        return fib(n-1) + fib(n-2);
    }

    public static void main17(String[] args) {
        System.out.println(fib(10));
    }


    // 求1+2+3+...+n
    public static int sumOneToTen(int n){
        if(n == 1){
            return 1;
        }
        return n + sumOneToTen(n - 1);
    }

    public static void main16(String[] args) {
        System.out.println(sumOneToTen(10));
    }

    // 求数字每位的和
    public static int sumL(int n){
        if(n < 10){
            return n;
        }
        return n%10 + sumL(n/10);
    }

    public static void main15(String[] args) {
        System.out.println(sumL(12345));
    }


    // 打印数字
    public static void print(int n){
        if(n < 10){
            System.out.print(n + " ");
        }else {
            print(n/10);
            System.out.print((n % 10) + " ");
        }
    }
    public static void main14(String[] args) {
        print(12345);
    }

    // 求n的阶乘
    public static int function(int n){
        // 递归终止条件
        if(n == 1){
            return 1;
        }
        return  n * function(n-1);
    }


    public static void main13(String[] args) {
        System.out.println(function(5));
    }



    // 方法重载
    // 方法的名称必须一样, 方法的参数不一样(数据类型, 个数, 顺序不一样), 返回值没有要求
    public static int max(int a, int b){
        return a > b ? a : b;
    }

    public static int max(int a, int b, int c){
        int ret = max(a, b);
        return ret > c ? ret : c;
    }

    public static int sum(int a, int b){
        return a+b;
        // 函数执行到 return , 自动退出
    }

    public static Double sum(Double a, Double b){
        return a+b;
        // 函数执行到 return , 自动退出
    }

    public static Double sum(int a, Double b){
        return a+b;
        // 函数执行到 return , 自动退出
    }


    public static void main12(String[] args) {
        int a = 10;
        int b = 20;
        int ret = sum(a, b);
        System.out.println(ret);
    }



    // 实参和形参的关系
    // 方法的形参相当于数组函数中的自变量
    public static void swap(int[] arr){
        int tmp = arr[0];
        arr[0] = arr[1];
        arr[1] = tmp;
    }

    public static void main11(String[] args) {
        // 数组在堆上存放
        int[] arr = {10, 20};
        swap(arr);

        System.out.println("arr[0]= " + arr[0]);
        System.out.println("arr[1]= " + arr[1]);

    }

    // 方法, 用的时候, 去调用就好了
    public static int add(int a, int b){
        return  a + b;
    }

    // 求n的阶乘
    public  static  int fac(int n){
        int ret = 1;
        for (int i = 1; i <= n; i++) {
            ret *= i;
        }
        return ret;
    }
    public static int facSum(int n){
        int sum = 0;
        for (int i = 1; i <= n; i++) {
            sum += fac(i);
        }
        return sum;
    }
    public static void main10(String[] args) {

        int rt = facSum(5);
        System.out.println(rt);


        /*int x = 1;
        int y = 2;
        int sum = add(x, y);
        System.out.println(sum);*/
    }


    public static void main9(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int count = 3;
        while( count != 0){
            System.out.println("请输入你的密码, 共有" + count + "次机会");
            String pass = scanner.nextLine();
            // 字符串比较
            if(pass.equals("123")){
                System.out.println("登录成功!!");
                break;
            }else {
                System.out.println("登录失败!");
            }
            count--;
        }
    }


    public static void main8(String[] args) {
        int n = 123;
        while (n != 0){
            System.out.print(n%10 + " ");
            n /= 10;
        }
    }

    public static void main7(String[] args) {

        for (int i = 1; i <= 9; i++) {
            for (int j = 1; j <= i; j++) {
                System.out.print(i + "*" + j + "=" + i*j + " ");
            }
            System.out.println();
        }
    }

    public static void main6(String[] args) {

        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++) {
                if((i == j) || (i+j == 5-1)){
                    System.out.print("*");
                }else {
                    System.out.print(" ");
                }
            }
            System.out.println();
        }

    }

    // 水仙花数
    public static void main5(String[] args) {

        for (int i = 1; i <= 999999; i++) {
            int count = 0;
            int tmp = i;
            int sum = 0;
            // 求i是几位数
            while(tmp != 0){
                tmp /= 10;
                count++;
            }
            tmp = i;
            while (tmp != 0){
                sum += Math.pow(tmp%10, count);
                tmp /= 10;
            }
            if(sum == i){
                System.out.println(i);
            }
        }

    }


    public static void main4(String[] args) {

        double sum = 1.0;
        int flag = 1;
        for (int i = 1; i <= 100; i++) {
            sum = sum + 1.0/i * flag;
            flag = -flag;
        }

        System.out.println(sum);
    }



    public static void main3(String[] args) {
        int n = 7;
        int count = 0;
        while(n != 0){
            n = n & (n-1);
            count++;
        }
        System.out.println(count);
    }

    public static void main2(String[] args) {
        int n = 7;
        int count = 0;
        while (n != 0){
            if((n&1 ) != 0){
                count++;
            }
            // 无符号右移
            n = n >>> 1;
        }
        System.out.println(count);
    }

    public static void main1(String[] args) {


        // 不管任何数字, 都必须移动31次
        int n = 7;
        int count = 0;
        for (int i = 0; i < 32; i++) {
            if(((n>>i) & 1) != 0){
                count++;
            }
        }
        System.out.println(count);
    }
}
